home *** CD-ROM | disk | FTP | other *** search
/ NeXTSTEP 3.1 (Developer) [x86] / NeXT Step 3.1 Intel dev.cdr.dmg / NextDeveloper / Examples / IndexingKit / QueryFieldEditor / QueryFieldEditor.m < prev    next >
Text File  |  1993-02-16  |  2KB  |  103 lines

  1. /*
  2. QueryFieldEditor.m - Copyright (c) 1992 NeXT Computer, Inc.
  3.  
  4. You may freely copy, distribute and reuse the code in this example.
  5. NeXT Computer, Inc. disclaims any warranty of any kind, expressed or implied, 
  6. as to its fitness for any particular use.
  7. */
  8.  
  9. #define    ESCAPE    0x1B
  10. #define    SPACE    0x20
  11.  
  12. #import    <appkit/NXCType.h>
  13. #import    "QueryFieldEditor.h"
  14.  
  15. @implementation QueryFieldEditor
  16.  
  17. static unsigned short
  18. QueryFilter(register unsigned short theChar, int flags, unsigned short charSet)
  19. {
  20.     if (theChar == ESCAPE) return 0;
  21.     if (theChar == SPACE && (flags & NX_COMMANDMASK)) return 0;
  22.     return NXFieldFilter(theChar, flags, charSet);
  23. }
  24.  
  25. - initFrame:(NXRect *)frameRect text:(char *)theText alignment:(int)mode
  26. {
  27.     [super initFrame:frameRect text:theText alignment:mode];
  28.     charFilterFunc = QueryFilter;
  29.     return self;
  30. }
  31.  
  32. - setCursor:(id <IXCursorPositioning>)aCursor
  33. {
  34.     cursor = aCursor;
  35.     return self;
  36. }
  37.  
  38. - complete
  39. {
  40.     char        word[1024];
  41.     char        *key;
  42.     unsigned        keyLength;
  43.     int            len;
  44.     NXSelPt        start, end;
  45.  
  46.     /* Check for error conditions */
  47.     if (cursor == nil)
  48.     {
  49.     NXBeep();
  50.     return nil;
  51.     }
  52.  
  53.     len = [self textLength];
  54.     [self getSubstring:word start:0 length:len];
  55.     word[len] = '\0';
  56.     for (key = word; *key; ++key)
  57.     if (NXIsUpper(*key)) *key = NXToLower(*key);
  58.  
  59.     /* Probe for the word -- if it exists take the next word */
  60.     if ([cursor setKey:(const void *)word andLength:len])
  61.     [cursor setNext];
  62.  
  63.     /* Check for suffix selection */ 
  64.     [self getSel:&start :&end];
  65.     if ((end.cp != len) || (start.cp == 0))
  66.     {
  67.     [self setSel:len :len];
  68.     [self getSel:&start :&end];
  69.     } else
  70.     len = start.cp;
  71.  
  72.     /* Cycle through keys */
  73.     [cursor getKey:(void **)&key andLength:&keyLength];
  74.     if (len < keyLength && !strncmp(word, key, len))
  75.     {
  76.     [self replaceSel:key + len length:keyLength - len];
  77.     [self setSel:len :[self textLength]];
  78.     } else
  79.     {
  80.     if (len == end.cp)
  81.     {
  82.         NXBeep();
  83.         return self;
  84.     }
  85.  
  86.     [self replaceSel:""];
  87.     return [self complete]; 
  88.     }
  89.  
  90.     return self;
  91. }
  92.  
  93. - keyDown:(NXEvent *)theEvent
  94. {
  95.     if (theEvent->data.key.charCode == ESCAPE
  96.     || (theEvent->data.key.charCode == ' ' && (theEvent->flags & NX_COMMANDMASK)))
  97.     return[self complete];
  98.  
  99.     return [super keyDown:theEvent];
  100. }
  101.  
  102. @end
  103.